﻿using QldtSdh.GUI.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace QldtSdh.GUI.DaoTao
{
    using BLL;
    using DAL;
    using DAL.Models;
    using QldtSdh.Utils;
    using QldtSdh.GUI.Utils;


    public partial class FormLopHocPhan_ChiTiet : BaseDialog
    {
        private LopHocPhan _LopHocPhan;

        private bool _DoNotUpdateGuiBySelectedPCGD = false;

        private LopHocPhan_PhanCongGiangDay SelectedPhanCongGiangDay
        {
            get
            {
                LopHocPhan_PhanCongGiangDay x = null;
                if (bsPhanCongGiangDay.Current != null)
                    x = bsPhanCongGiangDay.Current as LopHocPhan_PhanCongGiangDay;
                return x;
            }
        }

        public FormLopHocPhan_ChiTiet(LopHocPhan lopHocPhan)
        {
            InitializeComponent();

            cbxHinhThucHoc.DataSource = BizHinhThucHoc.GetList();
            cbxHinhThucThi.DataSource = BizHinhThucThi.GetList();

            this._LopHocPhan = lopHocPhan;

            DisplayObjectToGui();
        }

        private void DisplayObjectToGui()
        {
            // Hiển thị thông tin cơ bản của LHP
            var lopHocPhan = _LopHocPhan;
            txtMaLopHocPhan.Text = lopHocPhan.MaLopHocPhanGUID;
            txtTenLopHocPhan.Text = lopHocPhan.TenLopHocPhan;
            txtSoTinChi.Text = string.Format("{0} TC", lopHocPhan.HocPhan.SoTinChi);
            txtTongSoGio.Text = lopHocPhan.HocPhan.TongSoGio.ToString();
            nudHeSoDiemQTHT.Value = lopHocPhan.HeSoDiemQTHT;
            //cbxHinhThucHoc.MatchSelectedIndex(lopHocPhan.HinhThucHoc);
            //cbxHinhThucThi.MatchSelectedIndex(lopHocPhan.HinhThucThi);
            cbxHinhThucHoc.Text = lopHocPhan.HinhThucHoc;
            cbxHinhThucThi.Text = lopHocPhan.HinhThucThi;

            // Hiển thị danh sách giáo viên giảng dạy
            _DoNotUpdateGuiBySelectedPCGD = true;
            gridPhanCongGiangDay.SetDataGridViewAsReadonly(rowHeadersVisible: false, columnHeadersVisible: true);
            var lstPhanCongGiangDay = new MySortableBindingList<LopHocPhan_PhanCongGiangDay>(
                BizPhanCongGiangDay.GetListGiangVienGiangDay(_LopHocPhan.MaLopHocPhanGUID));
            bsPhanCongGiangDay.DataSource = lstPhanCongGiangDay;
            gridPhanCongGiangDay.SetDataSource(bsPhanCongGiangDay);
            _DoNotUpdateGuiBySelectedPCGD = false;
            UpdateGuiBySelectedPhanCongGiangDay();
            UpdateHintOnTongSoGioPhanCongGiangDay();
        }

        private void UpdateHintOnTongSoGioPhanCongGiangDay()
        {
            int tongSoGioPCGD = 0;
            if (bsPhanCongGiangDay.DataSource != null)
                foreach (var x in (IList<LopHocPhan_PhanCongGiangDay>)(bsPhanCongGiangDay.DataSource))
                    tongSoGioPCGD += x.TongSoGio;
            txtTongSoGioTheoPCGD.Text = tongSoGioPCGD.ToString();
            lblCanhBaoTongSoGioPCGDSai.Visible = (tongSoGioPCGD != _LopHocPhan.HocPhan.TongSoGio);
        }

        private void btnPhanCongGiangDay_Them_Click(object sender, EventArgs e)
        {
            var lstGiangVienDaPhanCong = bsPhanCongGiangDay.DataSource as IList<LopHocPhan_PhanCongGiangDay>;
            List<GiangVien> lstGiangVienCuaDonVi = null;
            DonVi donViPhuTrach = null;
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var hocPhan = BizHocPhan.GetByID(_LopHocPhan.MaHocPhanGUID, db);
                donViPhuTrach = BizDonViDaoTao.GetByMaDonViGUID(hocPhan.MaDonViPhuTrachGUID);
                lstGiangVienCuaDonVi = BizGiangVien.GetListOfDonVi(hocPhan.MaDonViPhuTrachGUID, db);
                if (lstGiangVienDaPhanCong != null)
                {
                    // Loại bỏ những giảng viên đã phân công ra khỏi danh sách
                    for (int i = lstGiangVienCuaDonVi.Count - 1; i >= 0; i--)
                    {
                        var maGiangVien = lstGiangVienCuaDonVi[i].MaGiangVien;
                        foreach (var x in lstGiangVienDaPhanCong)
                            if (x.MaGiangVien == maGiangVien)
                            {
                                lstGiangVienCuaDonVi.RemoveAt(i);
                                break;
                            }
                    }
                }
            }

            if (lstGiangVienCuaDonVi == null || lstGiangVienCuaDonVi.Count == 0)
            {
                DialogUtils.ShowError(string.Format("Không có giảng viên thuộc đơn vị {0} để phân công giảng dạy!", donViPhuTrach.TenDonVi));
                return;
            }
            var dlg = new DaoTao.FormLopHocPhan_ChiTiet_PhanCongGiangDay(_LopHocPhan, lstGiangVienCuaDonVi);
            dlg.ShowDialog();

            DisplayObjectToGui();
        }

        private void btnDongY_Click(object sender, EventArgs e)
        {
            //DialogUtils.ShowMessage("Nếu là học phần LUẬN VĂN thì phải kiểm tra để đảm bảo rằng, học viên phải đủ điều kiện làm luận văn\n" +
            //    "Ví dụ: Phải tích luỹ toàn bộ các tín chỉ trong Chương trình đào tạo, ...");

            #region Thu thập dữ liệu
            ep.Clear();
            var x = _LopHocPhan;
            var tenLopHocPhan = txtTenLopHocPhan.Text.Trim();
            if (string.IsNullOrEmpty(tenLopHocPhan))
            {
                ep.SetError(txtTenLopHocPhan, "Không được để trống tên lớp học phần");
                return;
            }
            var hinhThucHoc = cbxHinhThucHoc.Text;
            if (String.IsNullOrEmpty(hinhThucHoc))
            {
                ep.SetError(cbxHinhThucHoc, "Không được để trống hình thức học");
                return;
            }
            var hinhThucThi = cbxHinhThucThi.Text;
            if (string.IsNullOrEmpty(hinhThucThi))
            {
                ep.SetError(cbxHinhThucThi, "Không được để trống hình thức thi");
                return;
            }
            var heSoDiemQTHT = (int)nudHeSoDiemQTHT.Value;
            if (0 > heSoDiemQTHT || heSoDiemQTHT > 100)
            {
                ep.SetError(nudHeSoDiemQTHT, "Phần trăm điểm QTHT không hợp lệ");
                return;
            }
            #endregion

            #region Cập nhật dữ liệu
            try
            {
                BizLopHocPhan.Update(_LopHocPhan.MaLopHocPhanGUID, tenLopHocPhan, hinhThucHoc, hinhThucThi, heSoDiemQTHT);
                this.DialogResult = System.Windows.Forms.DialogResult.OK;
                this.Close();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Không thể cập nhật thông tin lớp học phần.\r\nChi tiết lỗi: {0}", exc.Message);
            }
            #endregion
        }

        private void nDiemQTHT_ValueChanged(object sender, EventArgs e)
        {
            txtHeSoDiemThi.Text = (100 - nudHeSoDiemQTHT.Value).ToString();
        }

        private void btnPhanCongGiangDay_Xoa_Click(object sender, EventArgs e)
        {
            LopHocPhan_PhanCongGiangDay x = this.SelectedPhanCongGiangDay;
            if (x == null)
            {
                DialogUtils.ShowError("Bạn phải chọn một giảng viên trước khi xoá thông tin phân công giảng dạy!");
                return;
            }
            try
            {
                BizPhanCongGiangDay.Delete(x);
                gridPhanCongGiangDay.DataSource = null;
                var oldIdx = bsPhanCongGiangDay.Position;
                bsPhanCongGiangDay.RemoveCurrent();
                gridPhanCongGiangDay.SetDataSource(bsPhanCongGiangDay);
                if (bsPhanCongGiangDay.Count > 0)
                {
                    if (oldIdx >= bsPhanCongGiangDay.Count)
                        oldIdx = bsPhanCongGiangDay.Count - 1;
                    bsPhanCongGiangDay.Position = oldIdx;
                }

                UpdateHintOnTongSoGioPhanCongGiangDay();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Không thể xoá thông tin phân công giảng dạy của giảng viên {0} tại lớp {1} được.\nChi tiết lỗi: {2}",
                    x.GiangVien.GiangVienDesc, _LopHocPhan.TenLopHocPhan, exc.Message);
            }
        }

        private void btnPhanCongGiangDay_Sua_Click(object sender, EventArgs e)
        {
            LopHocPhan_PhanCongGiangDay x = this.SelectedPhanCongGiangDay;
            if (x == null)
            {
                DialogUtils.ShowError("Bạn phải chọn một giảng viên trước khi chỉnh sửa thông tin phân công giảng dạy!");
                return;
            }
            var frm = new DaoTao.FormLopHocPhan_ChiTiet_PhanCongGiangDay_ChinhSua(_LopHocPhan, x);
            if (frm.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
            {
                DisplayObjectToGui();
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void bsPhanCongGiangDay_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotUpdateGuiBySelectedPCGD)
                return;
            UpdateGuiBySelectedPhanCongGiangDay();
        }

        private void UpdateGuiBySelectedPhanCongGiangDay()
        {
            var x = this.SelectedPhanCongGiangDay;
            btnPhanCongGiangDay_Sua.Enabled = btnPhanCongGiangDay_Xoa.Enabled = x != null;
        }
    }
}
